package com.steellee.leeexcel;

import com.steellee.leeexcel.dto.MetaExcelWriteDTO;
import com.steellee.leeexcel.msg.JSONMessage;
import com.steellee.leeexcel.service.PaExcelWriteByTemplateStart;
import com.steellee.leeexcel.service.PaExcelWriteStart;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

/**
 * Excel文件写出方法集合
 *
 * @author steellee
 * @date 2023-02-17
 */
public class PaExcelWrite {
    /**
     * 无模板时，支持写出 excel单个 sheet数据文件，数据对象传递，输出文件流
     *
     * @param excelHead                对象类
     * @param dataListByHead           对应对象数据 list
     * @param outSheetName             输出指定 sheet名称(非必填)
     * @param outputStreamByNoTemplate 无模板文件流
     * @return 返回结果, 并导出无模板 excel文件
     */
    public JSONMessage write(Class excelHead, List dataListByHead, String outSheetName, OutputStream outputStreamByNoTemplate) {

        //入参逐一传递-导出文件流 OutputStream文件流必填, Class返回对象必填,数据集合必填, sheetName非必填适用于写单个 sheet
        return new PaExcelWriteStart().write(excelHead, dataListByHead, outSheetName, outputStreamByNoTemplate, null);
    }

    /**
     * 有模板时，支持写出 excel单个 sheet数据文件，数据对象传递，输出文件到指定位置
     *
     * @param dataListByHead       对应对象数据 list
     * @param outSheetName         输出指定 sheet名称(非必填)
     * @param filePathByNoTemplate 无模板文件流(必填)
     * @param excelHead            对象类
     * @return 返回结果, 并导出无模板 excel文件
     */
    public JSONMessage write(Class excelHead, List dataListByHead, String outSheetName, String filePathByNoTemplate) {

        // excel写出方案二入参对象传递-导出到指定路径 filePath文件路径必填(完整路径带文件名)， Class返回对象必填
        // , 数据集合必填, sheetName非必填适用于写单个 sheet
        return new PaExcelWriteStart().write(excelHead, dataListByHead, outSheetName, null, filePathByNoTemplate);
    }

    /**
     * 有模板时, 支持导出 excel多个 sheet数据文件,通过对象MetaExcelReadDTO列表传递参数, 输出文件流
     *
     * @param metaExcelWriteDTOS       入参数据数据集合,包含: clazz对象类名.class dataList数据集合
     * @param outputStreamByNoTemplate 无模板文件流
     * @param isMap                    head是否基于 Map, 或者对象
     * @return 返回结果, 并导出无模板 excel文件
     */
    public JSONMessage write(List<MetaExcelWriteDTO> metaExcelWriteDTOS, OutputStream outputStreamByNoTemplate, Boolean isMap) {
        return new PaExcelWriteStart().write(metaExcelWriteDTOS, outputStreamByNoTemplate, null, isMap);
    }

    /**
     * 无模板时，支持导出 excel多个 sheet数据文件，通过对象MetaExcelReadDTO列表传递参数，输出文件到指定位置
     *
     * @param metaExcelWriteDTOS   入参数据数据集合,包含: clazz对象类名.class dataList数据集合
     * @param filePathByNoTemplate 无模板文件写出全路径(文件路径必须存在)
     * @param isMap                head是否基于 Map, 或者对象
     * @return 返回结果, 并导出无模板 excel文件
     */
    public JSONMessage write(List<MetaExcelWriteDTO> metaExcelWriteDTOS, String filePathByNoTemplate, Boolean isMap) {
        return new PaExcelWriteStart().write(metaExcelWriteDTOS, null, filePathByNoTemplate, isMap);
    }

    /**
     * 有模板时， 支持导出 excel单个 sheet数据文件， 输出文件流
     *
     * @param excelHead              对象类
     * @param dataListByHead         对应对象数据 list
     * @param inputStreamTemplate    文件模板流
     * @param outSheetNo             输出指定 sheet编码
     * @param outputStreamByTemplate 有模板文件输出流
     * @return 返回结果, 并导出有模板 excel文件
     */
    public JSONMessage writeByTemplate(Class excelHead, List dataListByHead, Integer outSheetNo, InputStream inputStreamTemplate, OutputStream outputStreamByTemplate) {

        //入参逐一传递-导出文件流 Outputstream文件流必填, Class返回对象必填,数据集合必填, sheetName非必填 适用于写单个 sheet
        return new PaExcelWriteByTemplateStart().writeByTemplate(excelHead, dataListByHead, outSheetNo, inputStreamTemplate, outputStreamByTemplate, null);
    }

    /**
     * 有模板时，支持导出 excel单个 sheet数据文件， 输出文件到指定位置
     *
     * @param excelHead           对象类
     * @param dataListByHead      对应对象数据 list
     * @param outSheetNo          输出指定 sheet编码
     * @param inputStreamTemplate 文件模板流
     * @param filePathByTemplate  文件写出全路径(文件路径必须存在)
     * @return 返回结果, 并导出有模板 excel文件
     */

    public JSONMessage writeByTemplate(Class excelHead, List dataListByHead, Integer outSheetNo, InputStream inputStreamTemplate, String filePathByTemplate) {

        //入参对象传递-导出到指定路径 filePath文件路径必填(完整路径带文件名)
        // , Class返回对象必填,数据集合必填, sheetName非必填 适用于写单个 sheet
        return new PaExcelWriteByTemplateStart().writeByTemplate(excelHead, dataListByHead, outSheetNo, inputStreamTemplate, null, filePathByTemplate);
    }

    /**
     * 支持导出 excel多个 sheet数据文件,通过对象MetaExcelReadDTO(基于对象/ Map)列表传递参数,输出文件流
     *
     * @param metaExcelWriteDTOS     入参数据数据集合, 包含: clazz对象类名.class dataList数据集合
     * @param inputStreamTemplate    文件模板流。
     * @param outputStreamByTemplate 文件流
     * @param isMap                  业务方入参数据是否是 Map
     * @return 返回结果, 并导出有模板 excel文件
     */
    public JSONMessage writeByTemplate(List<MetaExcelWriteDTO> metaExcelWriteDTOS, InputStream inputStreamTemplate, OutputStream outputStreamByTemplate, Boolean isMap) {

        // 入参对象集传递 OutputStream, List<MetaExcelWriteDTO>包含方案一参数集, 适用于写多个 sheet
        return new PaExcelWriteByTemplateStart().writeByTemplate(metaExcelWriteDTOS, inputStreamTemplate, outputStreamByTemplate, null, isMap);
    }

    /**
     * 支持导出 excel多个 sheet数据文件,通过对象MetaExcelReadDTO(基于对象/ Map) 列表传递参数, 输出件到指定位置
     *
     * @param metaExcelWriteDTOS  入参数据数据集合,包含: clazz对象类名.class dataList数据集合
     * @param inputStreamTemplate 文件模板流
     * @param filePathByTemplate  文件写出全路径(文件路径必须存在)
     * @param isMap               业务方入参数据是否是 Map
     * @ return 返回结果, 并导出有模板 excel文件
     */
    public JSONMessage writeByTemplate(List<MetaExcelWriteDTO> metaExcelWriteDTOS, InputStream inputStreamTemplate, String filePathByTemplate, Boolean isMap) {

        // 入参对象集传递 filePath, List<MetaExcelWriteDTO>包含方案一参数集, 适用于写多个 sheet
        return new PaExcelWriteByTemplateStart().writeByTemplate(metaExcelWriteDTOS, inputStreamTemplate, null, filePathByTemplate, isMap);
    }
}